<?php
require_once dirname(__FILE__).'/Example.php';
require_once dirname(__FILE__).'/Result.php';

/**
 * doctest 실행기
 *
 * 생성자에는 DocTestExample 객체의 배열을 넘길 수 있습니다.
 * php> $example = new DocTestExample('1 + 1', '2');
 * php> $runner = new DocTestRunner(array($example));
 *
 * 또는, 생성자에 아무 것도 넘기지 않고 나중에 addExample 메소드를 사용하여 추가할 수도 있습니다.
 * php> $runner = new DocTestRunner;
 * php> $runner->addExample($example);
 *
 * 테스트가 성공하면 DocTestResult 객체를 돌려줍니다.
 * php> $result = $runner->run();
 * php> $result->passed()
 * TRUE
 *
 * 테스트가 실패했을 경우에는 DocTestFailureResult 객체를 돌려줍니다.
 * php> $runner->addExample(new DocTestExample('1 + 1', '3'));
 * php> $result = $runner->run();
 * php> $result->passed()
 * FALSE
 * php> $result->example->source
 * '1 + 1'
 * php> $result->result
 * 2
 */
class DocTestRunner {
	function DocTestRunner($examples = array()) {
		$this->examples = $examples;
	}

	function addExample($example) {
		$this->examples[] = $example;
	}

	function run() {
		foreach ($this->examples as $__example) {
			if ($__example->expectsSomething()) {
				eval("\$__result = $__example->source;");
				eval("\$__expect = $__example->expect;");

				if ($__result !== $__expect)
					return new DocTestFailureResult($__example, $__result);
			} else {
				eval($__example->source);
			}
		}

		return new DocTestResult;
	}
}
